]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
st-texture-cache: Don't cache GIcons which cannot be serialized
authorFlorian Müllner <fmuellner@gnome.org>
Fri, 30 Sep 2011 17:57:09 +0000 (19:57 +0200)
committerFlorian Müllner <fmuellner@gnome.org>
Fri, 30 Sep 2011 18:14:25 +0000 (20:14 +0200)
For GIcons we use g_icon_to_string() in the key, but the function
will return NULL if the icon cannot be serialized. As a result,
all non-serializable GIcons of the same size end up with the same
cache key - an example for this are contacts with avatars, which
currently all end up with the same image.
To fix, opt out of caching for GIcons which cannot be serialized.

https://bugzilla.gnome.org/show_bug.cgi?id=660585

src/st/st-texture-cache.c

index 24471bcedb3300a6964544ab4fbc8ae013215379..1e83a0dea2beb8041412a3ec11edd89e077bccc8 100644 (file)
@@ -1177,8 +1177,15 @@ load_gicon_with_colors (StTextureCache    *cache,
   char *key;
   GtkIconTheme *theme;
   GtkIconInfo *info;
+  StTextureCachePolicy policy;
 
   gicon_string = g_icon_to_string (icon);
+  /* A return value of NULL indicates that the icon can not be serialized,
+   * so don't have a unique identifier for it as a cache key, and thus can't
+   * be cached. If it is cachable, we hardcode a policy of FOREVER here for
+   * now; we should actually blow this away on icon theme changes probably */
+  policy = gicon_string != NULL ? ST_TEXTURE_CACHE_POLICY_FOREVER
+                                : ST_TEXTURE_CACHE_POLICY_NONE;
   if (colors)
     {
       /* This raises some doubts about the practice of using string keys */
@@ -1210,9 +1217,7 @@ load_gicon_with_colors (StTextureCache    *cache,
     {
       /* Transfer ownership of key */
       request->key = key;
-      /* hardcoded here for now; we should actually blow this away on
-       * icon theme changes probably */
-      request->policy = ST_TEXTURE_CACHE_POLICY_FOREVER;
+      request->policy = policy;
       request->icon = g_object_ref (icon);
       request->icon_info = info;
       request->width = request->height = size;